package jsp;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author MissChen
 * @date 2024年05月13日 16:32
 */
@WebServlet("/app")
public class ApplicationServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取application对象，即获取ServletContext对象

        //方式一:在Servlet中获取
        ServletContext application = getServletContext();
        System.out.println(application);

        //方式二:通用的，不限于Servlet，但是获取方式的参数必须包含request或者session
        ServletContext application2=request.getServletContext();
        System.out.println(application2);

        HttpSession session=request.getSession();
        ServletContext application3=session.getServletContext();
        System.out.println(application3);

        // 总结:通过上述的几种方式都能获取到对应的ServletContext对象
        // 且获取的对象始终是同一个对象
        // 因为在一个应用中有且仅有一个application对象

        // 应用场景:
        // 1.获取服务器所在位置
        //方法参数可以为空字符串，如果为空字符串就相当于服务器的根目录
        String path=application.getRealPath("");
        System.out.println(path);

        //方法可以有参数，参数表示的是相对于服务器的根目录的路径
        // 该路径可以是抽象路径，即:当前可以不存在的路径
        // 方法的返回值为:服务器目录+方法参数
        path=application.getRealPath("/upload/"+new SimpleDateFormat("yyyyMMdd").format(new Date()));
        System.out.println("path:"+path);

        //此时获取的路径可能并不存在，可以通过代码创建对应的目录
        File file=new File(path);
        file.mkdirs();

        // 2.存储数据,该方式不建议使用，会导致服务器负载过高
        application.setAttribute("msg","Hello Application");

        // 3.获取全局初始化参数
        // 可以通过application对象提供的方法获取全局初始化参数
        String name=application.getInitParameter("name");
        System.out.println("全局初始化参数name的值为："+name);
    }
}
